package leetcode.code0394;

public class Solution extends Solution394 {

	private int N;

	@Override
	public String decodeString(String s) {
		char[] chars = s.toCharArray();
		this.N = s.length();
		return String.valueOf(f(chars, 0)[0]);// chars数组从index开始，解码
	}

	// chars数组从index开始，解码
	private Object[] f(char[] chars, int index) {
		StringBuffer cur = new StringBuffer();
		for (int i = index; i < this.N;) {
			char c = chars[i];// 当前字符
			if (c >= '1' && c <= '9') {// 从i+2位置开始需要重复，i是数字，i+1是[,i+2是开始位置
				StringBuffer num = new StringBuffer();// 数字可能不止一位
				int p = 0;// 这是个几位数
				do {
					num.append(c);
					c = chars[++p + i];
				} while (c >= '0' && c <= '9');// 这块可以有0
				Object[] res = this.f(chars, i + p + 1);// new String[]{"[]内的字符串",下一个处理位置}
				int k = Integer.valueOf(num.toString());// 重复次数
				while (k > 0) {
					cur.append(res[0]);// 重复
					k--;
				}
				i = (int) res[1];// 下一个该做的位置
			} else if (c == ']') {// 是结束标识，[]闭合，交给上级去复用
				return new Object[] { cur.toString(), i + 1};// 递归内的数据，下一个该做的位置
			} else {// 是普通字符
				cur.append(c);
				i++;
			}
		}
		return new Object[] { cur.toString() };// 全做完了，返回一个就行
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();
		so.debug4();
		so.debug5();
	}

}
